package com.briup.ch02;

public class Test07 {
    public static void main(String[] args) {
        //数据类型转换迪马02-PDF:34-41页
        /*
        数据类型转换：
        1.数据类型转换分为：隐式类型转换和显式类型转换
        2.基本数据类型的表示范围大小排序 byte<short&&char<int<long<float<double
         */
        //1.隐式类型转换
        //赋值过程中，小数据类型值或变量可以直接赋值给大的数据类型变量，类型会自动转换，将小的->大的
        //int赋值给long类型
        long num=10;//10默认是int
        System.out.println(num);
        // float类型值 赋值给 double类型变量
        double price = 8.0F;
        System.out.println(price);
        char c = 'a';
        // char 赋值给 int
        int t = c;
        System.out.println(t);
        // 下面会编译报错
        //float pi = 3.14;
        //int size = 123L;
        //int length = 178.5;
        byte b = 10;
        short s = 5;
        // (byte -> int) + (short -> int)
        // int + int
        // 结果为 int
        int sum = b + s;
        // 下一行编译报错，int 无法自动转换为 short进行赋值
        //short sum2 = b + s;
        System.out.println(sum);
        double d = 2.3;
        // (byte10->int10 - 5) * (short->int5) -> 5 * 5 = 25
        // int25 + double2.3
        // double25.0 + double2.3
        // 结果：double 27.3，必须用double变量来接收该值
        double h = (b - 5) * s + d;
        // double赋值给float，编译报错
        // float f = (b - 5) * s + d;
        System.out.println(h);

        // 1.数据赋值 强制类型转换
        float f1 = (float)3.14;
        System.out.println(f1); //3.14
        // 1.数据赋值 强制类型转换
        int size = (int)123L;
        System.out.println(size); //123
        double len = 178.5;
        // 2.变量赋值 强制类型转换
        int length = (int)len;
        System.out.println(length); //178
        b = 10;
        s = 5;
        d = 2.3;
        // 3.表达式赋值 强制类型转换
        float f2 = (float)((b - 5) * s + d);
        System.out.println(f2); //27.3
        // 为什么 int -> byte 成功了？
        byte b1 = 10;
        System.out.println(b1);
        // 为什么 int -> short 成功了？
        short s1 = 20;
        System.out.println(s1);
        // 为什么 int -> char 成功了？
        char c1 = 97;
        System.out.println(c1);
        // 为什么 b2赋值成功，b3却失败了？
        byte b2 = 127;
        System.out.println(b2);
        //byte b3 = 128;
        //System.out.println(b3);
        // 为什么 s2赋值成功，s3却失败了？
        short s2 = -32768;
        System.out.println(s2);
        //short s3 = -32769;
        //System.out.println(s3);
        // 为什么 c2赋值成功，c3却失败了？
        char c2 = 65535;
        System.out.println("c2: " + c2);
        // 为什么 int -> byte 成功了？
        // 字面值常量10，在赋值给b的时候，常量优化机制会起作用：
        // 系统会先判断10是否超出byte的取值范围，如果没有，则赋值成功，如果超出(比如128)，则赋值失败
//        byte b2 = 10;
//        System.out.println(b2);
        // 为什么 int -> short 成功了？
        // 系统会先判断20是否超出short的取值范围，结果是没有，则赋值成功
        short s3 = 20;
        System.out.println(s3);
        // 如果使用-32769赋值，超出short类型取值范围，则赋值失败
        //short s3 = -32769;
        //System.out.println(s3);
        // 下面3个赋值语句都 编译失败
//        byte b = 10L;
//        short s = 3.14F;
//        int n = 2.3;
        // 下面2个赋值语句 ok
//        byte b1 = 2;
//        short s2 = 3;
        // 变量赋值或表达式赋值，都编译失败
//        byte b3 = s2;
//        byte b4 = b1 + s2;
    }
}
